﻿#ifndef UISORTDIALOG_H
#define UISORTDIALOG_H

#include "uiconfirmdialog.h"
#include <QDoubleSpinBox>
/**
 * @class UiSortDialog
 * 
 * UiSortDialog类继承自UiConfirmDialog，用于提供一个排序对话框的用户界面。
 * 它允许用户选择一个排序字段和排序类型。
 */
class UiSortDialog : public UiConfirmDialog
{
    Q_OBJECT
public:
    /**
     * UiSortDialog构造函数。
     * 
     * @param fieldList 提供给用户选择的字段列表。
     * @param parent 父QWidget，默认为nullptr。
     */
    UiSortDialog(const QStringList& fieldList, QWidget* parent = nullptr);

    /**
     * 获取当前选择的字段。
     * 
     * @return 当前选择的字段名称。
     */
    QString field() const;

    /**
     * 设置当前选择的字段。
     * 
     * @param field 要设置的字段名称。
     */
    void setField(const QString &field);

    /**
     * 获取当前选择的排序类型。
     * 
     * @return 当前选择的排序类型（升序或降序）。
     */
    Qt::SortOrder sortType() const;

    /**
     * 设置当前选择的排序类型。
     * 
     * @param sortType 要设置的排序类型（Qt::AscendingOrder 或 Qt::DescendingOrder）。
     */
    void setSortType(const Qt::SortOrder &sortType);

    QStringList fieldList() const;
    void setFieldList(const QStringList &fieldList);

    void applySort(const QString& field, const Qt::SortOrder &sortType = Qt::AscendingOrder);

private slots:
    /**
     * 确认按钮的槽函数。
     *
     * 当用户点击确认按钮时触发，实现相应的确认逻辑。
     */
    void slotConfirm();

private:
    // UI组件声明
    class QLabel* m_fieldLabel = nullptr; /**< 显示字段名称的标签。 */
    class UiSortListView* m_fieldListView = nullptr; /**< 展示字段列表的视图。 */
    class QStandardItemModel* m_fieldModel = nullptr;
    class QLabel* m_sortTypeLabel = nullptr; /**< 显示排序类型名称的标签。 */
    class UiSortListView* m_sortTypeListView = nullptr; /**< 展示排序类型列表的视图。 */
    class QStandardItemModel* m_sortTypeModel = nullptr;

    QStringList m_fieldList;
    QString m_field; /**< 当前选择的字段。 */
    Qt::SortOrder m_sortType; /**< 当前选择的排序类型。 */
};

#include <QStyledItemDelegate>
/**
 * @class CSortDelegate
 * 
 * CSortDelegate是QStyledItemDelegate的子类，用于自定义表视图的绘制和大小提示。
 */
class CSortDelegate : public QStyledItemDelegate
{
public:
    /**
     * 构造函数
     * 
     * @param parent 父对象，通常为使用此代理的视图对象。
     */
    CSortDelegate(QObject* parent);

protected:
    /**
     * 绘制项视图。
     * 
     * 重写此函数以自定义表项的绘制方式。
     * 
     * @param painter 绘图器对象，用于绘制表项。
     * @param option 绘制选项，包含视图的样式信息。
     * @param index 表示要绘制的项的模型索引。
     */
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;

    /**
     * 提供项的大小提示。
     * 
     * 重写此函数以自定义表项的默认大小。
     * 
     * @param option 绘制选项，包含视图的样式信息。
     * @param index 表示要获取大小提示的项的模型索引。
     * @return 项的建议大小。
     */
    QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const;
};
#include <QListView>
/**
 * @class UiSortListView
 * 
 * 自定义的排序列表视图类，继承自QListView。
 * 提供了对选定项的索引列表的获取，以及在窗口大小改变时的自定义处理。
 */
class UiSortListView : public QListView
{
public:
    /**
     * 构造函数
     * 
     * @param parent 父QWidget，默认为nullptr。
     */
    UiSortListView(QWidget *parent);

    /**
     * 获取当前选中的项的索引列表。
     * 
     * @return QModelIndexList 包含所有选中项索引的列表。
     */
    QModelIndexList selectedIndexes() const;

protected:
    /**
     * 处理窗口大小改变事件。
     * 
     * @param e QResizeEvent* 表示大小改变事件的对象指针。
     */
    void resizeEvent(QResizeEvent* e);
};


#endif // UISORTDIALOG_H
